EC2 Instance Connectをより安全に使う方法
Amazon Linux 2やUbuntuを使用している場合、AWSアカウントの全員がすべてのEC2インスタンスにSSHでアクセスできる可能性が高くなります。
EC2 Instance Connectとは?
EC2 Instance Connectは、メタデータサービスを利用してEC2インスタンス上で公開SSH鍵を利用できるようにする。公開鍵をEC2インスタンスにプッシュするには、SendSSHPublicKey APIを使用する。
SSHデーモン(sshd)は、SSH接続時にメタデータサービスにすべての公開鍵を問い合わせるよう設定する必要がある。Amazon Linux 2とUbuntuのAMIでは、この設定がデフォルトで有効になっています。
どのように機能するのですか?
これを実現するためには、3つの要件を満たす必要があります。
- Amazon Linux 2またはUbuntuの公式AMIを使用してください。
- ポート22のトラフィックを許可する。過去にインスタンスの管理にSSHを使用していた場合、ポートはすでに開かれています。
- IAMユーザーまたはロールにパーミッション(アクションec2-instance-connect:SendSSHPublicKey)が必要です。AdministratorAccessor PowerUserAccessのような管理されたポリシーのおかげで、これらのパーミッションを持っている可能性が非常に高いです。
これで、あなたとあなたのIAMユーザーは、AWSアカウント内のすべてのEC2インスタンスにSSH接続を開くことができるようになりました。
上記の場合、どのように我々のEC2を保護するか。
EC2 Instance Connectを使用することに興味がない場合は、次のいずれかを行うことができます。
- EC2 Instance Connectをアンインストールします。
- ポート22のトラフィックを許可しない。
- Service control policies (SCP)でec2-instance-connect:SendSSHPublicKeyをグローバルに拒否してください。
EC2 Instance Connectを使用する場合。
ec2-instance-connect:SendSSHPublicKey アクションを慎重に付与してください。IAMのドキュメントによると、ユーザーを制限するためには条件しか使えません。EC2 Instance Connectのドキュメントによると、リソースレベルのパーミッションを使って、特定のEC2インスタンスへのアクセスを制限することもできるようです。残念ながら、EC2 Instanceタグはサポートされていないようです。
まとめ
AWS Linux 2およびUbuntu AMIでは、デフォルトでInstance Connectが有効になっています。これは、あなたのアカウントにアクセスできる人なら誰でも、あなたのEC2インスタンス(IAMユーザーまたはロール)にアクセスできるため、セキュリティ上の懸念がある。これは、コンソールベースのSSM(Systems Manager)にも言えることで、Key Pairがなくても使用できる。 しかし、これらのサービスが悪いというわけではなく、正しく活用すれば良いサービスである。